package de.uni_goettingen.sub.commons.ocr.abbyy.server;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ConcurrentModificationException;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import de.uni_goettingen.sub.commons.ocr.abbyy.server.hotfolder.Hotfolder;
import de.uni_goettingen.sub.commons.ocr.abbyy.server.hotfolder.HotfolderProvider;
public class LockFileHandler {
private static Object monitor = new Object();
private final String serverLockFile = "server.lock";
protected Hotfolder hotfolder;
protected URI lockUri;
private final static Logger logger = LoggerFactory.getLogger(LockFileHandler.class);
protected HotfolderProvider hotfolderProvider = new HotfolderProvider();
// for unit tests
void setHotfolderProvider(HotfolderProvider newProvider) {
hotfolderProvider = newProvider;
}
public void initConnection(String serverUrl, String user, String password) {
hotfolder = hotfolderProvider.createHotfolder(serverUrl, user, password);
try {
lockUri = new URI(serverUrl + serverLockFile);
} catch (URISyntaxException e) {
logger.error("Error with server lock file: " + serverUrl + serverLockFile, e);
}
}
public void createOrOverwriteLock(boolean overwriteLock) {
// need to synchronize on static object because of the Web Service
synchronized(monitor) {
try {
if (overwriteLock) {
// the lock is deleted here, but a new one is created later
hotfolder.deleteIfExists(lockUri);
}
boolean lockExists = hotfolder.exists(lockUri);
if (lockExists) {
throw new ConcurrentModificationException("Another client instance is running! See the lock file at " + lockUri);
}
writeLockFile();
} catch (IOException e) {
logger.error("Error with server lock file: " + lockUri, e);
}
}
}
/**
* Creates a lock file containing the IP address and an ID of the current JVM process.
*
* @throws IOException
*/
protected void writeLockFile() throws IOException {
String thisIp = InetAddress.getLocalHost().getHostAddress();
String thisJvmId = ManagementFactory.getRuntimeMXBean().getName();
OutputStream tempLock = hotfolder.createTmpFile("lock");
IOUtils.write("IP: " + thisIp + "\nID: " + thisJvmId, tempLock);
hotfolder.copyTmpFile("lock", lockUri);
hotfolder.deleteTmpFile("lock");
}
public void deleteLockAndCleanUp() {
// need to synchronize because of the Web Service
synchronized(monitor) {
try {
hotfolder.deleteIfExists(lockUri);
} catch (IOException e) {
logger.error("Error while deleting lock file: " + lockUri, e);
}
}
}
}